#include "master.h"

int		com_argc;
char	**com_argv;

/*
================
COM_CheckParm

Returns the position (1 to argc-1) in the program's argument list
where the given parameter apears, or 0 if not present
================
*/
int COM_CheckParm (char *parm)
{
	int		i;
	
	for (i=1 ; i<com_argc ; i++)
	{
		if (!com_argv[i])
			continue;		// NEXTSTEP sometimes clears appkit vars.
		if (!strcmp (parm,com_argv[i]))
			return i;
	}
		
	return 0;
}

char	*AdrToString (netadr_t a)
{
	static	char	s[64];
	
	sprintf (s, "%i.%i.%i.%i:%i",
		a.sin_addr.S_un.S_un_b.s_b1,
		a.sin_addr.S_un.S_un_b.s_b2,
		a.sin_addr.S_un.S_un_b.s_b3,
		a.sin_addr.S_un.S_un_b.s_b4,
		ntohs(a.sin_port));

	return s;
}

netadr_t	StringToAdr (char *s)
{
	netadr_t		a;
	int			b1, b2, b3, b4, p;
	
	b1 = b2 = b3 = b4 = p = 0;
	sscanf (s, "%i.%i.%i.%i:%i", &b1, &b2, &b3, &b4, &p);
	
	a.sin_addr.S_un.S_un_b.s_b1 = b1;
	a.sin_addr.S_un.S_un_b.s_b2 = b2;
	a.sin_addr.S_un.S_un_b.s_b3 = b3;
	a.sin_addr.S_un.S_un_b.s_b4 = b4;
	a.sin_port = ntohs(p);

	return a;
}

qboolean	CompareAdr (netadr_t a, netadr_t b)
{
	if (a.sin_addr.s_addr == b.sin_addr.s_addr 
	&& a.sin_port == b.sin_port)
		return true;
	return false;
}


void	mprintf (char *msg, ...)
{
	va_list	argptr;
	
	va_start (argptr, msg);
	vprintf (msg, argptr);
	vfprintf (logfile, msg, argptr);
	va_end (argptr);
		
}

int	msg_readcount;
char	*MSG_ReadString (void)
{
	char	*start;
	
	start = packet_data + msg_readcount;
	
	for ( ; msg_readcount < packet_length ; msg_readcount++)
		if (packet_data[msg_readcount] == '\n'
		|| packet_data[msg_readcount] == 0)
			break;
	
	packet_data[msg_readcount] = 0;
	msg_readcount++;
	
	return start;
}

/*
=====================================================================

  COMMAND LINES

=====================================================================
*/

#define	MAX_ARGS	32
#define	MAX_ARG_LENGTH	1024
int		cmd_argc;
char	cmd_argv[MAX_ARGS][MAX_ARG_LENGTH];

char		com_token[1024];
/*
==============
COM_Parse

Parse a token out of a string
==============
*/
char *COM_Parse (char *data)
{
	int		c;
	int		len;
	
	len = 0;
	com_token[0] = 0;
	
	if (!data)
		return NULL;
		
// skip whitespace
skipwhite:
	while ( (c = *data) <= ' ')
	{
		if (c == 0)
			return NULL;			// end of file;
		data++;
	}
	
// skip // comments
	if (c=='/' && data[1] == '/')
	{
		while (*data && *data != '\n')
			data++;
		goto skipwhite;
	}
	

// handle quoted strings specially
	if (c == '\"')
	{
		data++;
		while (1)
		{
			c = *data++;
			if (c=='\"' || !c)
			{
				com_token[len] = 0;
				return data;
			}
			com_token[len] = c;
			len++;
		}
	}

// parse a regular word
	do
	{
		com_token[len] = c;
		data++;
		len++;
		c = *data;
	} while (c>32);
	
	com_token[len] = 0;
	return data;
}

/*
============
Cmd_Argc
============
*/
int		Cmd_Argc (void)
{
	return cmd_argc;
}

/*
============
Cmd_Argv
============
*/
char	*Cmd_Argv (int arg)
{
	if ( (unsigned)arg >= cmd_argc )
		return "";
	return cmd_argv[arg];	
}

/*
============
Cmd_TokenizeString

Parses the given string into command line tokens.
============
*/
void Cmd_TokenizeString (char *text)
{	
	cmd_argc = 0;
	
	while (1)
	{
// skip whitespace up to a /n
		while (*text && *text <= ' ')
		{
			text++;
		}
		
		if (!*text)
			return;
	
		text = COM_Parse (text);
		if (!text)
			return;

		if (cmd_argc < MAX_ARGS)
		{
			strcpy (cmd_argv[cmd_argc], com_token);
			cmd_argc++;
		}
	}
	
}


/*
=====================================================================

  INFO STRINGS

=====================================================================
*/

/*
===============
Info_ValueForKey

Searches the string (userinfo or masterinfo) for the given
key and returns the associated value, or an empty string.
===============
*/
char *Info_ValueForKey (char *s, char *key)
{
	char	pkey[512];
	static	char value[512];
	char	*o;
	
	if (*s == '\\')
		s++;
	while (1)
	{
		o = pkey;
		while (*s != '\\')
		{
			if (!*s)
				return "";
			*o++ = *s++;
		}
		*o = 0;
		s++;

		o = value;
		while (*s != '\\' && *s)
		{
			if (!*s)
				return "";
			*o++ = *s++;
		}
		*o = 0;

		if (!strcmp (key, pkey) )
			return value;

		if (!*s)
			return "";
		s++;
	}
}

void Info_RemoveKey (char *s, char *key)
{
	char	*start;
	char	pkey[512];
	char	value[512];
	char	*o;

	if (strstr (key, "\\"))
	{
		printf ("Can't use a key with a \\\n");
		return;
	}

	while (1)
	{
		start = s;
		if (*s == '\\')
			s++;
		o = pkey;
		while (*s != '\\')
		{
			if (!*s)
				return;
			*o++ = *s++;
		}
		*o = 0;
		s++;

		o = value;
		while (*s != '\\' && *s)
		{
			if (!*s)
				return;
			*o++ = *s++;
		}
		*o = 0;

		if (!strcmp (key, pkey) )
		{
			strcpy (start, s);	// remove this part
			return;
		}

		if (!*s)
			return;
	}

}

void Info_RemovePrefixedKeys (char *start, char prefix)
{
	char	*s;
	char	pkey[512];
	char	value[512];
	char	*o;

	s = start;

	while (1)
	{
		if (*s == '\\')
			s++;
		o = pkey;
		while (*s != '\\')
		{
			if (!*s)
				return;
			*o++ = *s++;
		}
		*o = 0;
		s++;

		o = value;
		while (*s != '\\' && *s)
		{
			if (!*s)
				return;
			*o++ = *s++;
		}
		*o = 0;

		if (pkey[0] == prefix)
		{
			Info_RemoveKey (start, pkey);
			s = start;
		}

		if (!*s)
			return;
	}

}

void Info_SetValueForKey (char *s, char *key, char *value)
{
	char	new[512];

	if (strstr (key, "\\") || strstr (value, "\\") )
	{
		printf ("Can't use keys or values with a \\\n");
		return;
	}
	if (strstr (key, "\"") || strstr (value, "\"") )
	{
		printf ("Can't use keys or values with a \\\n");
		return;
	}

	Info_RemoveKey (s, key);
	if (!value || !strlen(value))
		return;

	sprintf (new, "\\%s\\%s", key, value);

	if (strlen(new) + strlen(s) > MAX_INFO_STRING)
	{
		printf ("Info string length exceeded\n");
		return;
	}
	strcat (s, new);
}

void Info_Print (char *s)
{
	char	key[512];
	char	value[512];
	char	*o;
	int		l;

	if (*s == '\\')
		s++;
	while (*s)
	{
		o = key;
		while (*s && *s != '\\')
			*o++ = *s++;

		l = o - key;
		if (l < 20)
		{
			memset (o, ' ', 20-l);
			key[20] = 0;
		}
		else
			*o = 0;
		printf ("%s", key);

		if (!*s)
		{
			printf ("MISSING VALUE\n");
			return;
		}

		o = value;
		s++;
		while (*s && *s != '\\')
			*o++ = *s++;
		*o = 0;

		if (*s)
			s++;
		printf ("%s\n", value);
	}
}
